package at.horario.service.impl;

import at.horario.dao.ChDisciplinaDao;
import at.horario.dao.ChProfessorDao;
import at.horario.dao.GenericDao;
import at.horario.model.*;
import at.horario.service.LoadDataManager;
import org.apache.log4j.Logger;

import java.util.Arrays;
import static java.util.Arrays.asList;


/**
 * Created by IntelliJ IDEA.
 * User: AT
 * Date: Nov 3, 2007
 * Time: 7:53:24 PM
 * To change this template use File | Settings | File Templates.
 */
public class LoadDataManagerImpl implements LoadDataManager {
    private static Logger log = Logger.getLogger(LoadDataManagerImpl.class);

    private GenericDao<Disciplina, String> disciplinaDao;
    private GenericDao<Ciclo, Integer> cicloDao;
    private GenericDao<Grupo, String> grupoDao;
    private GenericDao<Classe, Integer> classeDao;
    private ChDisciplinaDao chDisciplinaDao;
    private ChProfessorDao chProfessorDao;
    private GenericDao<Role, Long> roleDao;

    public void setRoleDao(GenericDao<Role, Long> roleDao) {
        this.roleDao = roleDao;
    }

    public void setClasseDao(GenericDao<Classe, Integer> classeDao) {
        this.classeDao = classeDao;
    }

    public void setDisciplinaDao(GenericDao<Disciplina, String> disciplinaDao) {
        this.disciplinaDao = disciplinaDao;
    }

    public void setCicloDao(GenericDao<Ciclo, Integer> cicloDao) {
        this.cicloDao = cicloDao;
    }

    public void setGrupoDao(GenericDao<Grupo, String> grupoDao) {
        this.grupoDao = grupoDao;
    }

    public void setChDisciplinaDao(ChDisciplinaDao chDisciplinaDao) {
        this.chDisciplinaDao = chDisciplinaDao;
    }

    public void setChProfessorDao(ChProfessorDao chProfessorDao) {
        this.chProfessorDao = chProfessorDao;
    }

    public void addCiclos() {
        if (cicloDao.count() == 0) {
            Ciclo ciclo1 = new Ciclo(1, "Ciclo I");
            Classe classe8 = new Classe(8, ciclo1);
            Classe classe9 = new Classe(9, ciclo1);
            Classe classe10 = new Classe(10, ciclo1);

            ciclo1.getClasses().addAll(asList(classe8, classe9, classe10));
            Ciclo ciclo2 = new Ciclo(2, "Ciclo II");
            Classe classe11 = new Classe(11, ciclo2);
            Classe classe12 = new Classe(12, ciclo2);

            ciclo2.getClasses().addAll(asList(classe11, classe12));

            cicloDao.saveOrUpdateAll(asList(ciclo1, ciclo2));
        }
    }

    public void addAll() {
        log.info("LoadDataManagerImpl.addAll");
        addRoles();
        addCiclos();
        addDisciplinas();
        addGrupos();
        addChDisciplina();
        addChProfessor();
    }

    public void addRoles() {
        log.info("LoadDataManagerImpl.addRoles");
        if (roleDao.count() == 0) {
            Role[] rolesArray = new Role[]{new Role("user"),
                    new Role("admin"),
                    new Role("horarioform"),
                    new Role("horariolist"),
            };

            roleDao.saveOrUpdateAll(Arrays.asList(rolesArray));
        }
    }

    public void addClasses() {
        addCiclos();
    }

    public void addDisciplinas() {
        if (disciplinaDao.count() == 0) {
            Disciplina disciplinaB = new Disciplina("B", "Biologia", 5);
            Disciplina disciplinaD = new Disciplina("D", "Desenho", 11);
            Disciplina disciplinaF = new Disciplina("F", "Física", 6);
            Disciplina disciplinaFr = new Disciplina("Fr", "Francês", 10);
            Disciplina disciplinaG = new Disciplina("G", "Geografia", 4);
            Disciplina disciplinaH = new Disciplina("H", "História", 3);
            Disciplina disciplinaI = new Disciplina("I", "Inglês", 7);
            Disciplina disciplinaM = new Disciplina("M", "Matemática", 2);
            Disciplina disciplinaP = new Disciplina("P", "Português", 1);
            Disciplina disciplinaPh = new Disciplina("Ph", "Filosofia", 9);
            Disciplina disciplinaQ = new Disciplina("Q", "Quimica", 8);

            disciplinaDao.saveOrUpdateAll(asList(disciplinaB,
                    disciplinaD,
                    disciplinaF,
                    disciplinaFr,
                    disciplinaG,
                    disciplinaH,
                    disciplinaI,
                    disciplinaM,
                    disciplinaP,
                    disciplinaPh,
                    disciplinaQ));

        }

    }

    public void addGrupos() {
        log.info("LoadDataManagerImpl.addGrupos");
        if (grupoDao.count() == 0) {

            addDisciplinas();
            Disciplina disciplinaB = disciplinaDao.get("B");
            Disciplina disciplinaD = disciplinaDao.get("D");
            Disciplina disciplinaF = disciplinaDao.get("F");
            Disciplina disciplinaFr = disciplinaDao.get("Fr");
            Disciplina disciplinaG = disciplinaDao.get("G");
            Disciplina disciplinaH = disciplinaDao.get("H");
            Disciplina disciplinaI = disciplinaDao.get("I");
            Disciplina disciplinaM = disciplinaDao.get("M");
            Disciplina disciplinaP = disciplinaDao.get("P");
            Disciplina disciplinaPh = disciplinaDao.get("Ph");
            Disciplina disciplinaQ = disciplinaDao.get("Q");

            addClasses();

            Classe classe8 = classeDao.get(8);
            Classe classe9 = classeDao.get(9);
            Classe classe10 = classeDao.get(10);
            Classe classe11 = classeDao.get(11);
            Classe classe12 = classeDao.get(12);

            Grupo grupoAI = new Grupo("AI", "Letras Simples", 1);
            grupoAI.getDisciplinas().addAll(asList(disciplinaP, disciplinaFr, disciplinaG, disciplinaH, disciplinaI, disciplinaPh));
            grupoAI.getClasses().addAll(asList(classe11, classe12));
            Grupo grupoAIII = new Grupo("AIII", "Letras com Biologia", 2);
            grupoAIII.getDisciplinas().addAll(asList(disciplinaP, disciplinaFr, disciplinaG, disciplinaH, disciplinaI, disciplinaPh, disciplinaB));
            grupoAIII.getClasses().addAll(asList(classe11, classe12));
            Grupo grupoAIV = new Grupo("AIV", "Letras com Mat�matica", 3);
            grupoAIV.getDisciplinas().addAll(asList(disciplinaP, disciplinaFr, disciplinaG, disciplinaH, disciplinaI, disciplinaPh, disciplinaM));
            grupoAIV.getClasses().addAll(asList(classe11, classe12));
            Grupo grupoBI = new Grupo("BI", "Ci�ncias com Geografia", 4);
            grupoBI.getDisciplinas().addAll(asList(disciplinaP, disciplinaI, disciplinaM, disciplinaQ, disciplinaF, disciplinaG));
            grupoBI.getClasses().addAll(asList(classe11, classe12));
            Grupo grupoBII = new Grupo("BII", "Ci�ncias com Biologia", 5);
            grupoBII.getDisciplinas().addAll(asList(disciplinaP, disciplinaI, disciplinaM, disciplinaQ, disciplinaF, disciplinaB));
            grupoBII.getClasses().addAll(asList(classe11, classe12));
            Grupo grupoC = new Grupo("C", "Ci�ncias", 6);
            grupoC.getDisciplinas().addAll(asList(disciplinaP, disciplinaI, disciplinaM, disciplinaQ, disciplinaF, disciplinaD));
            grupoC.getClasses().addAll(asList(classe11, classe12));
            Grupo grupoCiencias = new Grupo("ciencias", "Ci�ncias", 2);
            grupoCiencias.getDisciplinas().addAll(asList(disciplinaM, disciplinaQ, disciplinaF, disciplinaD));
            grupoCiencias.getClasses().addAll(asList(classe10));
            Grupo grupoGlobal = new Grupo("global", "Global - Ci�ncias e Letras", 1);
            grupoGlobal.getDisciplinas().addAll(asList(disciplinaP, disciplinaI, disciplinaM, disciplinaQ, disciplinaF, disciplinaD, disciplinaH, disciplinaG, disciplinaB));
            grupoGlobal.getClasses().addAll(asList(classe8, classe9, classe10));
            Grupo grupoLetras = new Grupo("letras", "Letras", 3);
            grupoLetras.getDisciplinas().addAll(asList(disciplinaP, disciplinaG, disciplinaH, disciplinaI));
            grupoLetras.getClasses().addAll(asList(classe10));

            grupoDao.saveOrUpdateAll(asList(
                    grupoGlobal, grupoCiencias, grupoLetras, grupoAI, grupoAIII, grupoAIV, grupoBI, grupoBII, grupoC));

        }

    }

    public void addChProfessor() {
        if (chProfessorDao.count() == 0) {

            addDisciplinas();
            Disciplina disciplinaB = disciplinaDao.get("B");
            Disciplina disciplinaD = disciplinaDao.get("D");
            Disciplina disciplinaF = disciplinaDao.get("F");
            Disciplina disciplinaFr = disciplinaDao.get("Fr");
            Disciplina disciplinaG = disciplinaDao.get("G");
            Disciplina disciplinaH = disciplinaDao.get("H");
            Disciplina disciplinaI = disciplinaDao.get("I");
            Disciplina disciplinaM = disciplinaDao.get("M");
            Disciplina disciplinaP = disciplinaDao.get("P");
            Disciplina disciplinaPh = disciplinaDao.get("Ph");
            Disciplina disciplinaQ = disciplinaDao.get("Q");

            addCiclos();
            Ciclo ciclo1 = cicloDao.get(1);
            Ciclo ciclo2 = cicloDao.get(2);

            chProfessorDao.saveOrUpdateAll(asList(
                    new ChProfessor(disciplinaB, ciclo1, 24),
                    new ChProfessor(disciplinaB, ciclo2, 20),
                    new ChProfessor(disciplinaD, ciclo1, 24),
                    new ChProfessor(disciplinaD, ciclo2, 20),
                    new ChProfessor(disciplinaF, ciclo1, 24),
                    new ChProfessor(disciplinaF, ciclo2, 20),
                    new ChProfessor(disciplinaFr, ciclo1, 24),
                    new ChProfessor(disciplinaFr, ciclo2, 20),
                    new ChProfessor(disciplinaG, ciclo1, 24),
                    new ChProfessor(disciplinaG, ciclo2, 20),
                    new ChProfessor(disciplinaH, ciclo1, 24),
                    new ChProfessor(disciplinaH, ciclo2, 20),
                    new ChProfessor(disciplinaI, ciclo1, 24),
                    new ChProfessor(disciplinaI, ciclo2, 20),
                    new ChProfessor(disciplinaM, ciclo1, 25),
                    new ChProfessor(disciplinaM, ciclo2, 20),
                    new ChProfessor(disciplinaP, ciclo1, 25),
                    new ChProfessor(disciplinaP, ciclo2, 20),
                    new ChProfessor(disciplinaPh, ciclo1, 24),
                    new ChProfessor(disciplinaPh, ciclo2, 20),
                    new ChProfessor(disciplinaQ, ciclo1, 24),
                    new ChProfessor(disciplinaQ, ciclo2, 20)

            )
            );

        }
    }

    public void addChDisciplina() {
        if (chDisciplinaDao.count() == 0) {
            addDisciplinas();

            Disciplina disciplinaB = disciplinaDao.get("B");
            Disciplina disciplinaD = disciplinaDao.get("D");
            Disciplina disciplinaF = disciplinaDao.get("F");
            Disciplina disciplinaFr = disciplinaDao.get("Fr");
            Disciplina disciplinaG = disciplinaDao.get("G");
            Disciplina disciplinaH = disciplinaDao.get("H");
            Disciplina disciplinaI = disciplinaDao.get("I");
            Disciplina disciplinaM = disciplinaDao.get("M");
            Disciplina disciplinaP = disciplinaDao.get("P");
            Disciplina disciplinaPh = disciplinaDao.get("Ph");
            Disciplina disciplinaQ = disciplinaDao.get("Q");

            addGrupos();
            Grupo grupoAI = grupoDao.get("AI");
            Grupo grupoAIII = grupoDao.get("AIII");
            Grupo grupoAIV = grupoDao.get("AIV");
            Grupo grupoBI = grupoDao.get("BI");
            Grupo grupoBII = grupoDao.get("BII");
            Grupo grupoC = grupoDao.get("C");
            Grupo grupociencias = grupoDao.get("ciencias");
            Grupo grupoglobal = grupoDao.get("global");
            Grupo grupoletras = grupoDao.get("letras");


            chDisciplinaDao.saveOrUpdateAll(asList(
                    new ChDisciplina(disciplinaB, grupoAIII, 4, 0),
                    new ChDisciplina(disciplinaB, grupoAIII, 4, 1),
                    new ChDisciplina(disciplinaB, grupoBII, 4, 0),
                    new ChDisciplina(disciplinaB, grupoBII, 4, 1),
                    new ChDisciplina(disciplinaB, grupociencias, 3, 0),
                    new ChDisciplina(disciplinaB, grupociencias, 2, 1),
                    new ChDisciplina(disciplinaB, grupoglobal, 3, 0),
                    new ChDisciplina(disciplinaB, grupoglobal, 2, 1),
                    new ChDisciplina(disciplinaD, grupoC, 3, 0),
                    new ChDisciplina(disciplinaD, grupoC, 3, 1),
                    new ChDisciplina(disciplinaD, grupociencias, 2, 0),
                    new ChDisciplina(disciplinaD, grupociencias, 2, 1),
                    new ChDisciplina(disciplinaD, grupoglobal, 2, 0),
                    new ChDisciplina(disciplinaD, grupoglobal, 2, 1),
                    new ChDisciplina(disciplinaF, grupoBI, 4, 0),
                    new ChDisciplina(disciplinaF, grupoBI, 4, 1),
                    new ChDisciplina(disciplinaF, grupoBII, 4, 0),
                    new ChDisciplina(disciplinaF, grupoBII, 4, 1),
                    new ChDisciplina(disciplinaF, grupoC, 4, 0),
                    new ChDisciplina(disciplinaF, grupoC, 4, 1),
                    new ChDisciplina(disciplinaF, grupociencias, 3, 0),
                    new ChDisciplina(disciplinaF, grupociencias, 3, 1),
                    new ChDisciplina(disciplinaF, grupoglobal, 3, 0),
                    new ChDisciplina(disciplinaF, grupoglobal, 3, 1),
                    new ChDisciplina(disciplinaFr, grupoAI, 4, 0),
                    new ChDisciplina(disciplinaFr, grupoAI, 4, 1),
                    new ChDisciplina(disciplinaFr, grupoAIII, 4, 0),
                    new ChDisciplina(disciplinaFr, grupoAIII, 4, 1),
                    new ChDisciplina(disciplinaFr, grupoAIV, 4, 0),
                    new ChDisciplina(disciplinaFr, grupoAIV, 4, 1),
                    new ChDisciplina(disciplinaG, grupoAI, 4, 0),
                    new ChDisciplina(disciplinaG, grupoAI, 4, 1),
                    new ChDisciplina(disciplinaG, grupoAIII, 4, 0),
                    new ChDisciplina(disciplinaG, grupoAIII, 4, 1),
                    new ChDisciplina(disciplinaG, grupoAIV, 4, 0),
                    new ChDisciplina(disciplinaG, grupoAIV, 4, 1),
                    new ChDisciplina(disciplinaG, grupoBI, 4, 0),
                    new ChDisciplina(disciplinaG, grupoBI, 4, 1),
                    new ChDisciplina(disciplinaG, grupoglobal, 2, 0),
                    new ChDisciplina(disciplinaG, grupoglobal, 2, 1),
                    new ChDisciplina(disciplinaG, grupoletras, 2, 0),
                    new ChDisciplina(disciplinaG, grupoletras, 2, 1),
                    new ChDisciplina(disciplinaH, grupoAI, 4, 0),
                    new ChDisciplina(disciplinaH, grupoAI, 4, 1),
                    new ChDisciplina(disciplinaH, grupoAIII, 4, 0),
                    new ChDisciplina(disciplinaH, grupoAIII, 4, 1),
                    new ChDisciplina(disciplinaH, grupoAIV, 4, 0),
                    new ChDisciplina(disciplinaH, grupoAIV, 4, 1),
                    new ChDisciplina(disciplinaH, grupoglobal, 2, 0),
                    new ChDisciplina(disciplinaH, grupoglobal, 2, 1),
                    new ChDisciplina(disciplinaH, grupoletras, 2, 0),
                    new ChDisciplina(disciplinaH, grupoletras, 2, 1),
                    new ChDisciplina(disciplinaI, grupoAI, 4, 0),
                    new ChDisciplina(disciplinaI, grupoAI, 4, 1),
                    new ChDisciplina(disciplinaI, grupoAIII, 4, 0),
                    new ChDisciplina(disciplinaI, grupoAIII, 4, 1),
                    new ChDisciplina(disciplinaI, grupoAIV, 4, 0),
                    new ChDisciplina(disciplinaI, grupoAIV, 4, 1),
                    new ChDisciplina(disciplinaI, grupoBI, 4, 0),
                    new ChDisciplina(disciplinaI, grupoBI, 4, 1),
                    new ChDisciplina(disciplinaI, grupoBII, 4, 0),
                    new ChDisciplina(disciplinaI, grupoBII, 4, 1),
                    new ChDisciplina(disciplinaI, grupoC, 4, 0),
                    new ChDisciplina(disciplinaI, grupoC, 4, 1),
                    new ChDisciplina(disciplinaI, grupoglobal, 3, 0),
                    new ChDisciplina(disciplinaI, grupoglobal, 3, 1),
                    new ChDisciplina(disciplinaI, grupociencias, 3, 0),
                    new ChDisciplina(disciplinaI, grupociencias, 3, 1),
                    new ChDisciplina(disciplinaI, grupoletras, 3, 0),
                    new ChDisciplina(disciplinaI, grupoletras, 3, 1),
                    new ChDisciplina(disciplinaM, grupoAIV, 5, 0),
                    new ChDisciplina(disciplinaM, grupoAIV, 4, 1),
                    new ChDisciplina(disciplinaM, grupoBI, 5, 0),
                    new ChDisciplina(disciplinaM, grupoBI, 4, 1),
                    new ChDisciplina(disciplinaM, grupoBII, 5, 0),
                    new ChDisciplina(disciplinaM, grupoBII, 4, 1),
                    new ChDisciplina(disciplinaM, grupoC, 5, 0),
                    new ChDisciplina(disciplinaM, grupoC, 4, 1),
                    new ChDisciplina(disciplinaM, grupociencias, 5, 0),
                    new ChDisciplina(disciplinaM, grupociencias, 4, 1),
                    new ChDisciplina(disciplinaM, grupoglobal, 5, 0),
                    new ChDisciplina(disciplinaM, grupoglobal, 4, 1),
                    new ChDisciplina(disciplinaP, grupoAI, 4, 0),
                    new ChDisciplina(disciplinaP, grupoAI, 4, 1),
                    new ChDisciplina(disciplinaP, grupoAIII, 4, 0),
                    new ChDisciplina(disciplinaP, grupoAIII, 4, 1),
                    new ChDisciplina(disciplinaP, grupoAIV, 4, 0),
                    new ChDisciplina(disciplinaP, grupoAIV, 4, 1),
                    new ChDisciplina(disciplinaP, grupoBI, 4, 0),
                    new ChDisciplina(disciplinaP, grupoBI, 4, 1),
                    new ChDisciplina(disciplinaP, grupoBII, 4, 0),
                    new ChDisciplina(disciplinaP, grupoBII, 4, 1),
                    new ChDisciplina(disciplinaP, grupoC, 4, 0),
                    new ChDisciplina(disciplinaP, grupoC, 4, 1),
                    new ChDisciplina(disciplinaP, grupoglobal, 5, 0),
                    new ChDisciplina(disciplinaP, grupoglobal, 4, 1),
                    new ChDisciplina(disciplinaP, grupoletras, 5, 0),
                    new ChDisciplina(disciplinaP, grupoletras, 4, 1),
                    new ChDisciplina(disciplinaPh, grupoAI, 4, 0),
                    new ChDisciplina(disciplinaPh, grupoAI, 4, 1),
                    new ChDisciplina(disciplinaPh, grupoAIII, 4, 0),
                    new ChDisciplina(disciplinaPh, grupoAIII, 4, 1),
                    new ChDisciplina(disciplinaPh, grupoAIV, 4, 0),
                    new ChDisciplina(disciplinaPh, grupoAIV, 4, 1),
                    new ChDisciplina(disciplinaQ, grupoBI, 4, 0),
                    new ChDisciplina(disciplinaQ, grupoBI, 4, 1),
                    new ChDisciplina(disciplinaQ, grupoBII, 4, 0),
                    new ChDisciplina(disciplinaQ, grupoBII, 4, 1),
                    new ChDisciplina(disciplinaQ, grupoC, 4, 0),
                    new ChDisciplina(disciplinaQ, grupoC, 4, 1),
                    new ChDisciplina(disciplinaQ, grupociencias, 3, 0),
                    new ChDisciplina(disciplinaQ, grupociencias, 3, 1),
                    new ChDisciplina(disciplinaQ, grupoglobal, 3, 0),
                    new ChDisciplina(disciplinaQ, grupoglobal, 3, 1)
            )
            );

        }

    }


}
